﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace RemoteDesktopLib
{
    class CaptureScreen
    {
        //Structure kích thước
        public struct SIZE
        {
            public int Cx;
            public int Cy;
        }

        //Hàm chụp ảnh màn hình
        public static Bitmap CaptureDesktop()
        {
            Bitmap bmp = null;
            IntPtr hDC = IntPtr.Zero;
            try
            {
                SIZE size;
                // Lấy device context của desktop 
                hDC = Win32Stuff.GetDC(Win32Stuff.GetActiveWindow());
                IntPtr hMemDC = GDIStuff.CreateCompatibleDC(hDC);

                // Lấy kích thước của màn hình đưa vào size
                size.Cx = Win32Stuff.GetSystemMetrics
                          (Win32Stuff.SM_CXSCREEN);

                size.Cy = Win32Stuff.GetSystemMetrics
                          (Win32Stuff.SM_CYSCREEN);

                // Tạo bitmap dựa vào device context và size

                IntPtr hBitmap = GDIStuff.CreateCompatibleBitmap(hDC, size.Cx, size.Cy);

                if (hBitmap != IntPtr.Zero)
                {
                    IntPtr hOld = GDIStuff.SelectObject
                        (hMemDC, hBitmap);

                    // Copy bitmap vào biến chứa bmp

                    GDIStuff.BitBlt(hMemDC, 0, 0, size.Cx, size.Cy, hDC,
                                                   0, 0, GDIStuff.SRCCOPY);

                    GDIStuff.SelectObject(hMemDC, hOld);
                    GDIStuff.DeleteDC(hMemDC);
                    bmp = Image.FromHbitmap(hBitmap);
                    GDIStuff.DeleteObject(hBitmap);
                    GC.Collect();
                }
            }
            finally
            {
                if (hDC != IntPtr.Zero)
                {
                    Win32Stuff.ReleaseDC(Win32Stuff.GetActiveWindow(), hDC);
                }
            }
            return bmp;
        }
    }
}
